package main

import (
	"fmt"
)

// 单链表

type Node struct {
	Data int
	Next *Node
	Prev *Node
}

type LinkList struct {
	Head *Node
	Tail *Node
}

func (l *LinkList) Append(node *Node) {
	if l.Head == nil {
		l.Head, l.Tail = node, node
	} else {
		lastNode := l.Tail
		node.Prev = lastNode // 绑定上一个节点
		lastNode.Next = node // 在现有的尾部链一个节点
		l.Tail = node        // 更新尾部的节点
	}
}

func (l *LinkList) Print() {
	curNode := l.Head
	for curNode != nil {
		fmt.Println(curNode.Data)
		curNode = curNode.Next
	}
}

// 从尾到头遍历
func (l *LinkList) Rev() {
	lastNode := l.Tail
	for lastNode != nil {
		fmt.Println(lastNode.Data)
		lastNode = lastNode.Prev
	}
}

func main() {
	l := &LinkList{}
	l.Append(&Node{Data: 1})
	l.Append(&Node{Data: 2})
	l.Append(&Node{Data: 3})
	l.Append(&Node{Data: 4})
	l.Print()
	l.Rev()
}
